﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Arquitectura.SEM;
using System.Data;

namespace FAS.SEM.ClasesSEM
{
    /*******************************************************
    /* Autor : Efrain Gutierrez / Miguel Ortiz
    /* Fecha : 11/04/2013
    /* Lenguaje: C# Framework 4 .NET
    /* Descripción: Clase encargada de las funciones de los Problemas SEM
    /********************************************************/

    public class ProblemaSEM : AbstractSem
    {
        /*Atributos Globales*/
        private int idProblema;
        private String texto;
        private List<OpcionSEM> listaOpciones;
    
        /********************************************************
        /* _construct()
        /* Proposito: inicializar el objeto.
        /* Parametros : ninguno
        /* Limitaciones: ninguna.
        /* Retorna: ninguna
        /*********************************************************/    
        public ProblemaSEM() : base()
        {
        }
   
    
        /********************************************************
        /* getIdProblema()
        /* Proposito: regresar atributo idProblema.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de idProblema.
        /*********************************************************/
        public int getIdProblema()
        {
            return this.idProblema; 
        }
    
        /********************************************************
        /* getTexto()
        /* Proposito: regresar atributo texto.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de texto
        /*********************************************************/
        public String getTexto()
        {
            return this.texto; 
        }
   
        /********************************************************
        /* setIdProblema(int IdProblema)
        /* Proposito: cambiar el valor del atributo idProblema.
        /* Parametros : idProblema
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setIdProblema(int idProblema)
        {
            this.idProblema= idProblema; 
        }
    
        /********************************************************
        /* setTexto(string texto)
        /* Proposito: cambiar el valor del atributo nombre.
        /* Parametros : texto
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/
        public void setTexto(String texto)
        {
            if(texto!= null)
                this.texto= texto; 
        }
    
        /********************************************************
        /* setListaOpciones(List listaOpciones)
        /* Proposito: cambiar el valor del atributo listaOpciones.
        /* Parametros : listaOpciones
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/
        public void setListaOpciones(List<OpcionSEM> listaOpciones)
        {
            if(listaOpciones!= null)
                this.listaOpciones= listaOpciones; 
        }
    
        /********************************************************
        /* getListaOpciones()
        /* Proposito: regresar atributo listaOpciones.
        /* Parametros : Ninguno
        /* Limitaciones: listaOpciones debe de ser diferente de null.
        /* Retorna: listaProblemas
        /*********************************************************/
        public List<OpcionSEM> getListaOpciones()
        {
             return this.listaOpciones; 
        }
    
        /********************************************************
        /* getOpcionesDeProblema()
        /* Proposito: buscar opciones en la base de datos de problema local
        /* Parametros : Ninguno
        /* Limitaciones: Ninguna
        /* Retorna: Ninguno
        /*********************************************************/
        public void getOpcionesDeProblema()
        {
            OpcionSEM opcion = new OpcionSEM();
            this.setListaOpciones(opcion.getOpcionesDeProblema(this.idProblema));
        }
    
        /********************************************************
        /* setNR(int idExamen Alumno)
        /* Proposito: calificar NR del problema
        /* Parametros : examen al que aplicar el nr
        /* Limitaciones: ninguna
        /* Retorna: nada
        /*********************************************************/
        public void setNR(int idExamenAlumno)
        {
            int id = 0;
            foreach(OpcionSEM opcion in this.listaOpciones)
            {
                if(opcion.esRespuesta())
                    break;
                id++;
            }
            this.updateRespuesta(idExamenAlumno, this.getIdProblema(), id);
        }
    
        /********************************************************
        /* updateRespuesta(int idExamenAlumno,int idProblema,int idOpcion)
        /* Proposito: seleccionar respuesta de un problema de un examen
        /* Parametros : id del examen, id del problema y id de la opcion seleccionada
        /* Limitaciones: ninguna
        /* Retorna: nada
        /*********************************************************/
        public void updateRespuesta(int idExamenAlumno,int idProblema,int idOpcion)
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("IdExamenAlumnoP",idExamenAlumno);
            diccionario.Add("IdProblemaP", idProblema);
            diccionario.Add("IdOpcionP", idOpcion);
            this.execProcedure("updateRespuesta", diccionario);
        }
    
        /********************************************************
        /* comandos()
        /* Proposito: validar la existencia de un Problema en la base de datos.
        /* Parametros : ninguno
        /* Limitaciones: Problema inicializado.
        /* Retorna: Verdadero o Falso
        /*********************************************************/

        protected override void comandos()
        {
            this.id = "IdProblema";
            this.tabla = "`Problema`";
            this.strDelete = "DeleteProblema";
            this.strInsertar = "InsertarProblema";
            this.strUpdate = "UpdateProblema";
        }
    
        /********************************************************
        /* fillFas(my_sql_row row)
        /* Proposito: inicializar un Problema con la info de la base de datos.
        /* Parametros : row de consulta
        /* Limitaciones: row completo mysql
        /* Retorna: Ninguna
        /*********************************************************/
        protected override void fillSem(DataRow row)
        {
            this.idProblema = int.Parse(row[0].ToString());
            this.texto = row[3].ToString();
            this.listaOpciones = new List<OpcionSEM>();
            DataSet p = this.exec("SELECT IdOpcion from `Opcion` where IdProblema = '"+this.idProblema+"'");
            foreach(DataRow r in p.Tables[0].Rows)
            {
                OpcionSEM obj = new OpcionSEM();
                obj = (OpcionSEM)obj.get(r[0].ToString());
                this.listaOpciones.Add(obj);
            }
        }

        /********************************************************
        /* get(int id)
        /* Proposito: inicializar un Problema a partir de un id desde una base de datos.
        /* Parametros : id del Problema
        /* Limitaciones: Ninguna
        /* Retorna: Problema
        /*********************************************************/
        public override AbstractSem get(object id)
        {
            AbstractSem abs = getAbstractSem(id,this.tabla,this.id);
            return abs;
        }
    
        /********************************************************
        /* getAll
        /* Proposito: inicializar lista de Problemaes existentes desde una base de datos.
        /* Parametros : Ninguna
        /* Limitaciones: Ninguna
        /* Retorna: Lista de Problemaes
        /*********************************************************/

        public List<ProblemaSEM> getAll()
        {
            List<AbstractSem> abs = base.getAll();
            List<ProblemaSEM> lst = new List<ProblemaSEM>();
            foreach (var v in abs)
                lst.Add((ProblemaSEM)v);
            return lst;
        }
    
        /********************************************************
        /* getAtributos()
        /* Proposito: regresar arreglo de atributos locales
        /* Parametros : Ninguna
        /* Limitaciones: Ninguna
        /* Retorna: Arreglo
        /*********************************************************/

        public override Dictionary<string, object> getAtributos()
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("IdProblemaP",idProblema);
            diccionario.Add("TextoP", texto);
            return diccionario;
        }
    } // fin de la clase Problema

}
